package com.bailian.app.controller.example;

import com.bailian.app.controller.BaseAppController;
import com.bailian.common.core.domain.AjaxResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 连接状态检查使用示例
 * 展示如何在控制器中使用连接状态检查功能
 * 
 * @author bailian
 */
@RestController
@RequestMapping("/app/api/example")
public class ConnectionCheckExample extends BaseAppController {

    /**
     * 示例1：在响应前检查连接状态
     */
    @GetMapping("/check-connection")
    public AjaxResult checkConnection() {
        // 在返回响应前检查客户端是否仍然连接
        if (!isClientConnected()) {
            // 客户端已断开，返回null（Spring会自动处理）
            return null;
        }
        
        // 客户端仍然连接，正常返回响应
        return AjaxResult.success("连接正常");
    }

    /**
     * 示例2：使用连接状态检查和日志记录
     */
    @GetMapping("/check-with-log")
    public AjaxResult checkWithLog() {
        // 检查连接状态并记录日志
        if (!checkConnectionAndLog("获取用户信息")) {
            return null;
        }
        
        // 执行业务逻辑
        Long userId = getCurrentUserId();
        return AjaxResult.success("用户ID: " + userId);
    }

    /**
     * 示例3：使用安全执行方法
     */
    @GetMapping("/safe-execute")
    public AjaxResult safeExecute() {
        // 安全地执行操作，如果客户端断开则跳过
        boolean executed = safeExecute("数据库查询", () -> {
            // 模拟耗时的数据库操作
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });
        
        if (!executed) {
            return null;
        }
        
        return AjaxResult.success("操作执行成功");
    }

    /**
     * 示例4：在异步操作中使用连接状态检查
     */
    @GetMapping("/async-operation")
    public AjaxResult asyncOperation() {
        // 在开始异步操作前检查连接状态
        if (!isClientConnected()) {
            return null;
        }
        
        // 模拟异步操作
        new Thread(() -> {
            try {
                // 模拟耗时操作
                Thread.sleep(2000);
                
                // 在异步操作完成后再次检查连接状态
                if (isClientConnected()) {
                    // 客户端仍然连接，可以安全地执行后续操作
                    System.out.println("异步操作完成，客户端仍然连接");
                } else {
                    // 客户端已断开，跳过后续操作
                    System.out.println("异步操作完成，但客户端已断开");
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
        
        return AjaxResult.success("异步操作已启动");
    }
} 